Ŀ Ŀ Bir Derleyici Yazmak ster misiniz? ٳ PS 31 ubat'96 Tun Sabuncu Programlarnz yazmak iin kullandnz derleyicilerin nasl altn hi merak ettiniz mi ? PASCAL ya da PROLOG gibi bir dilde yazlm kaynak kodu okuyan hatta anlayan ve orada tanmlanan sreleri PC'nizin anlayabilecei tek dil olan makina diline eviren bu programlarn yazlmas gerekten ok zor ve uzun bir uratr. Bu nedenle kimse kendi bana derleyici yazmaya kalkmaz. Yazlmevleri ekipler kurup deneyimli programclar arasnda iblm yaparlar. Tasarm ve kodlama ile geen uzun bir dnemden sonra daha uzun bir zaman denemeler iin ayrlr. nk kimse "baz PASCAL programlarn derleyen" bir programa para demez. Eh artk herhalde tek banza derleyici yazmaya kalkmazsnz! aka bir yana, sonucu ne olursa olsun her ura ( derleyici yazmaya almak dahil ) size bireyler kazandrr. Ama gelin biz biraz akademik taklalm. Bir sredir burada 'nce ler" bal ile tantmaya altmz veri yaplar size derleyici ve yorumlayc ( kaynak kodu bellekte altran, EXE oluturmayan programlar. szgelimi GWBASIC ) yazmann kaplarn aacak altn bir anahtar. Aslnda Programlama Sanat'nn nceki saylarnda da bu konulara deindik. "Pascal'da bal listeler" bal ile verilen programlar veri yaplarnn alt balklarndan. zetle yt, kuyruk, bal listeler ve aalar bilmeden derleyici yazmaya almak biraz krebe oynamaya benziyor. Laf- gzaf bir yana brakalm ve konuya yeni snan okuyucularmz iin derleyicilerin gerekte ne yaptklarn ksaca anlatalm. Siz programc olarak PC'niz iin hibir anlam olmayan 'print' ya da 'a:=b+c' gibi laflar yazp ondan bireyler beklersiniz. te derleyiciler bu ASCII ynn bazen satr numaralarn ( BASIC ) bazen ';' gibi iaretleri ( PASCAL ) bazen de '(' gibi ayralar ( LISP ) kullanarak paralarlar. Buraya kadar basit. Fakat bundan sonra deiik algoritmalarla kurulmu zmleyicileri ( parser ) kullanarak sizin pascalca anlattnz ileri ( dardan bir say al, ikiyle arp, ekrana yaz vb. ) bellekte simgelerler. te veri yaplar bu noktada devreye girer. Szgelimi a=b+c gibi bir ifade, a / \ = + / \ b c byle bir aata simgelenir. Bu aalara da zmleme aalar denir. ( zmleyicilere ve aalara gelecek saylarda deineceiz. ) zmleyici birim, zerine deni yaptktan sonra sra deerlendirme ve kod retme modlne gelir. Bu aa iin retilecek ASSEMBLY kodu ise mov AX,WORD PTR b add AX,WORD PTR c mov WORD PTR a,AX olacaktr. Daha nceki yazlarmzdan tandnz yt veri tipi matematiksel ifadelerin hem deerlendirilmesinde hem de ASSEMBLY'ye evirilmesinde kullanlr. Postfix ve Prefix Bizim gnlk yaammzda ve PASCAL, C gibi dillerde kullandmz sralama alternatifsiz deildir. Matematiksel iaretlerin deiken grubunun nne ya da ardna sralanmas da olasdr. Bu iki seenekle birlikte geleneksel yaklam aadaki tabloda verilmitir. infix postfix prefix A+B AB+ +AB A+B-C AB+C- -+ABC (A+B)*(C-D) AB+CD-* *+AB-CD A^B*C-D+E/F/(G+H) AB^C*D-EF/GH+/+ +-*^ABCD//EF+GH ((A+B)*C-(D-E))^(F+G) AB+C*DE--FG+^ ^-+ABC-DE+FG A-B/(C*D^E) ABCDE^*/- -A/B*C^DE Bu ay ki kodumuzun temelini oluturan postfix'i gznne alacak olursak, deerlendirme sreci yle iler: Bir matematiksel iarete gelene dek deikenler ( ya da saylar ) srasyla PUSH edilir ( yta konur ) . Bir iarete gelindiinde PUSH edilmi olanlar POP edilerek ( yttan alnarak ) ilem, zerlerinde uygulanr. rnein tablodaki ilk satrda A ve B nce push edilir, '+' iareti gelince pop edilerek toplanr. ( Dier satrlar iin saylar vererek kendinizi deneyebilirsiniz. ) imdi gelelim derleyici yazma ksmna! yle bir program yazalm ki postfix gsterimde girdiimiz matemetiksel ifadelere karlk gelen ASSEMBLY kodunu yazsn. Biz konunun daha iyi anlalmas iin basit bir ASSEMBLY tanmladk. Alt tane komut var: ADD, SUB, MUL, DIV, MOV, PUT. Assembly'miz veri aktarm iin geici bir deikene gerek duyarsa TEMP_1, TEMP_2 gibi kaynak koda dahil edebiliyor. Bu i iin PUT, tek yazmana ( register ) atama yapmak iinse MOV. rnein 'ab+' postfix ifadesi iin u kod retiliyor: MOV a ADD b PUT TEMP_1 Eer 'ab+c*de--fg+' ifadesi girilecek olursa sonu biraz daha uzun: MOV a ADD b PUT TEMP_1 MOV TEMP_1 MUL c PUT TEMP_2 MOV d SUB e PUT TEMP_3 MOV TEMP_2 SUB TEMP_3 MOV f ADD g PUT TEMP_5 Artk bir derleyicinin alma ekli hakknda hi de azmsanmayacak bir bilgi sahibi oldunuz. Kaynak kod dnda hibir eksiiniz kalmad. Haydi davrann tulara...